<%@ page pageEncoding="utf-8" %>

<html>
<head>
<title>サンプル02 アノテーション</title>
<style>
PRE{
  font-family: "ＭＳ ゴシック" "Lucida Console";
  color: white;
  background-color: black;
  padding: 10px;
  margin-left: 10px;
}
</style>
</head>
<body>

  <p>
    <a href="sayHello.action">http://localhost:8080/sample02/sayHello.action</a>
  </p>

  <h1>アノテーション</h1>
  <p>
    アノテーションを使ったActionのサンプル。<br/>
    struts2ではActionクラスにアノテーションってのを書くことで、struts.xmlの記述を省略することができる。<br/>
  </p>
<pre>
@Result(name="success", value="/hello.jsp") // ← コレ
public class SayHelloAction {
    public String execute() {
    	System.out.println("Hello World!!");
    	return "success";
    }
}
</pre>
  <p>
    ↑の一行目がアノテーション。これを書いておくと、struts.xmlの記述が不要になる。<br/>
    おー。これは楽チンだー。（棒読み）
  </p>

  <h1>決まりがいっぱいある</h1>
  <p>
    アノテーションを使うことで、設定ファイルのわずらわしさはなくなったんだけど<br/>
    そのかわりいろんな決まりを守らないといけない。<br/>
    <dl>
      <dt><b>web.xmlのフィルター設定に、このクラスのパッケージ名を書かないといけない。</b></dt>
      <dd>
        web.xmlのFilterDispatcherってところに、Actionクラスのパッケージ名をパラメータとして渡す。<br/>
        これを忘れるとActionが見つからなくてエラーになってしまう。<br/>
        これはカンマとか空白とか改行とかで区切って複数指定できるみたい
<pre>
  &lt;filter&gt;
    &lt;filter-name&gt;struts2&lt;/filter-name&gt;
    &lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt;
    &lt;init-param&gt;
      &lt;param-name&gt;actionPackages&lt;/param-name&gt;
      &lt;param-value&gt;struts2.sample02&lt;/param-value&gt;
    &lt;/init-param&gt;
  &lt;/filter&gt;
</pre>
      </dd>
      <dt><b>クラス名は「****Action」でないといけない。</b></dt>
      <dd>
        struts2のフレームワークは、↑で指定したパッケージから、クラス名の末尾が「Action」のクラスを探す。<br/>
        なので、Actionクラスのクラス名は***Actionでないといけない。<br/>
      </dd>
      <dt><b>アクションに対応するパスは勝手に決められる。</b></dt>
      <dd>
        「このURLにアクセスしたらこのActionを実行する」というActionとURLの対応は<br/>
        設定ファイルで指定してたけど、アノテーションを使う場合は、対応するURLを自分で指定することができない。<br/>
        フレームワークが勝手に決めてしまう。<br/>
        クラス名の先頭を小文字にして、末尾の「Action」をとって、拡張子の「.action」をつけたのがURLになる。<br/>
        <p>SayHelloAction → sayHello.action</p>
        って感じ。
      </dd>
    </dl>
  </p>

  <h1>successは省略できる</h1>
  「Result」アノテーションの「success」は省略できる。
<pre>
@Result(name="success", value="/hello.jsp")
</pre>
  <p>
    は
  </p>
<pre>
@Result("/hello.jsp")
</pre>
  <p>
    って書いても有効なわけだ。
  </p>

</body>
</html>
